package ru.zombator.taskman.server.query;

import java.io.IOException;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;

import ru.zombator.taskman.core.query.IResponderSvc;
import ru.zombator.taskman.core.query.Protocol;
import ru.zombator.taskman.server.query.corba.manual.CorbaServer;
import ru.zombator.taskman.server.query.rmi.RmiServer;
import ru.zombator.taskman.server.query.tcp.TcpServer;
import ru.zombator.taskman.server.query.udp.UdpServer;

/**
 * Фабрика серверов
 * 
 * @author nvamelichev
 * 
 */
public class ServerFactory {
	/**
	 * Создает сервер, работающий по заданному протоколу.
	 * 
	 * @param proto
	 *            - протокол
	 * @return сервер, или <code>null</code>, если протокол
	 * не поддерживается
	 * @throws ServerInitException 
	 */
	public static IResponderSvc createServer(Protocol proto) throws ServerInitException {
		switch (proto) {
		case RMI:
			try {
				return new RmiServer();
			} catch (RemoteException e) {
				throw new ServerInitException(e);
			} catch (AlreadyBoundException e) {
				throw new ServerInitException(e);
			}
		case TCP:
			try {
				return new TcpServer();
			} catch (IOException e) {
				throw new ServerInitException(e);
			}
		case UDP:
			try {
				return new UdpServer();
			} catch (IOException e) {
				throw new ServerInitException(e);
			}
		case CORBA:
			try {
				return new CorbaServer();
			} catch (RemoteException e) {
				throw new ServerInitException(e);
			}
		}
		return null;		
	}
}
